package fr.generali.accueilclient.gwt.client.ui.components.errorpanel;

import java.util.Collection;

import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;

import fr.generali.accueilclient.gwt.client.ui.common.message.Message;
import fr.generali.accueilclient.gwt.client.ui.common.message.MessageRenderer;

/**
 * Il s'agit d'un widget ayant vocation a afficher des messages.<br>
 * Ce widget fait appel à un rendererpour formater les messages qu'on lui passe
 * avant<br>
 * de les afficher dans un panel.
 */
public class ErrorPanel extends Composite {

    private static ErrorBlockUiBinder uiBinder = GWT.create(ErrorBlockUiBinder.class);

    interface ErrorBlockUiBinder extends UiBinder<Widget, ErrorPanel> {
    }

    public interface Resources extends ClientBundle {

        @Source({"components/errorpanel/errorPanel.css" })
        Style style();

        interface Style extends CssResource {
            String errorBlock();
        }
    }

    @UiField
    Resources res;

    @UiField
    HTML messageContainer;

    public ErrorPanel() {
        initWidget(uiBinder.createAndBindUi(this));
        res.style().ensureInjected();
        this.setVisible(false);
    }

    /**
     * Permet de spécifier une liste de messages au widget.<br>
     * Cette méthode passe dans un premier temps par le {@link MessageRenderer}
     * pour formatter<br>
     * les messages. Ils sont ensuite ajoutés dans le conteneur approprié.<br>
     * 
     * @param messages : la liste des messages
     */
    public void setMessages(final Collection<Message> messages) {
        if (messages != null) {
            messageContainer.setHTML(MessageRenderer.renderAsString(messages));
        }
        this.setVisible(messages != null && messages.size() > 0);
    }

    /**
     * Permet de spécifier un message au widget.<br>
     * Cette méthode passe dans un premier temps par le {@link MessageRenderer}
     * pour formatter<br>
     * le message. est ensuite ajouté dans le conteneur approprié.<br>
     * 
     * @param message : le message
     */
    public void setMessage(final Message message) {
        messageContainer.setHTML(MessageRenderer.renderAsString(message));
        setVisible(true);
    }

    /**
     * Permet de faire disparaitre le panel des messages d'erreurs
     */
    public void clear() {
        setMessages(null);
        setVisible(false);
    }
}
